package utils

import (
	"backend/config"
	"backend/log"
	"fmt"

	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"

	"backend/models"
)

var DB *gorm.DB

func InitDB(cfg config.Mysql) {

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.Database)
	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	DB = DB.Debug()
	if err != nil {
		log.Logger.Fatal("无法连接到数据库: ", zap.String("dsn", dsn), zap.Error(err))
	}
	log.Logger.Info("数据库连接成功")
	models := []interface{}{
		&models.User{},
		&models.Menu{},
		&models.Group{},
		&models.Permission{},
		&models.Role{},
	}

	err = DB.AutoMigrate(models...)
	if err != nil {
		log.Logger.Fatal("数据库迁移失败:", zap.Error(err))
	}

	log.Logger.Info("数据库迁移成功")

	//初始化超管用户
	insertSuperUser()
}

func insertSuperUser() {
	superUser := models.User{
		Username: "admin",
		Email:    "root@qq.com",
		Password: "123456", // 确保在生产环境中安全地存储和加密密码
		Supper:   true,
		Status:   true,
	}

	// 检查是否存在
	var count int64
	DB.Model(&models.User{}).Where("email = ?", superUser.Email).Count(&count)
	if count == 0 {
		// 插入超级管理员
		if err := DB.Create(&superUser).Error; err != nil {
			log.Logger.Fatal("插入超管用户失败:", zap.Error(err))
		}
		log.Logger.Info("超级管理员用户插入成功")
	} else {
		log.Logger.Info("超级管理员用户已存在")
	}
}
